+ [IAD-MIGRATION-120] Создать таблицу auth_db.sessions

Развертывание физической структуры таблиц пользователей и активных сессий в СУБД

Author

Services Task & Simulation Framework Documentation

Published

July 13, 2026

NoteКраткая карточка задачи
  • Репозиторий / Компонент: auth-service (База auth_db, контур Identity & Auth / SECURITY).
  • Целевая СУБД: PostgreSQL v15+.
  • Ссылка на Метод: Метод регистрации
  • Статус: Готово к реализации

  • Инструкция по шагам: Выполнить DDL-миграцию для создания таблицы реестра выданных долгоживущих refresh-сессий (sessions) для контроля Сценариев 1, 2 и 3. В соответствии со спецификацией безопасности, в базу записывается строго криптографический хэш рефреш-токена, а не его сырое значение.

CREATE TABLE IF NOT EXISTS auth_db.sessions (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    user_id UUID REFERENCES auth_db.users(id) ON DELETE CASCADE,
    token_hash VARCHAR(64) UNIQUE NOT NULL,    -- SHA-256 хэш от Refresh Token
    device_fingerprint VARCHAR(255),           -- Для контроля контекста и Breach Detection
    ip_address VARCHAR(45),
    is_revoked BOOLEAN DEFAULT false,          -- Изменяется на true при Logout или компрометации
    expires_at TIMESTAMP WITH TIME ZONE NOT NULL,
    created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
    updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);

-- Индексы для оптимизации валидации и ротации токенов на Шаге 12
CREATE INDEX IF NOT EXISTS idx_sessions_token_lookup 
ON auth_db.sessions (token_hash) 
WHERE is_revoked = false AND expires_at > NOW();

CREATE INDEX IF NOT EXISTS idx_sessions_user_active 
ON auth_db.sessions (user_id) 
WHERE is_revoked = false;

OLD

Для поддержки безопасного механизма обновления токенов и определения повторного использования угнанных ключей (Reuse Detection), база данных хранит метаданные сессий в изолированной таблице.

-- Таблица сессий и долгоживущих Refresh-токенов
CREATE TABLE user_sessions (
    id BIGSERIAL PRIMARY KEY,
    user_id VARCHAR(50) NOT NULL REFERENCES users(id) ON DELETE CASCADE,
    token VARCHAR(512) NOT NULL UNIQUE,       -- Хэш или тело Refresh-токена
    is_revoked BOOLEAN NOT NULL DEFAULT FALSE,-- Флаг аннулирования токена (использован/украден)
    expires_at TIMESTAMP WITH TIME ZONE NOT NULL,
    created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);

-- Индекс для мгновенной верификации токена при фоновом обновлении Dio Interceptor
CREATE INDEX idx_user_sessions_lookup ON user_sessions(token) WHERE is_revoked = FALSE;